package com.quanxiaoha.weblog.common.domain.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.quanxiaoha.weblog.common.domain.dos.UserLoginLogDO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * @author: 犬小哈
 * @url: www.quanxiaoha.com
 * @date: 2025-01-28 15:00
 * @description: 用户登录日志 Mapper
 **/
public interface UserLoginLogMapper extends BaseMapper<UserLoginLogDO> {

    /**
     * 根据用户ID查询登录日志
     * @param userId 用户ID
     * @param page 分页参数
     * @return 登录日志列表
     */
    default Page<UserLoginLogDO> selectByUserId(Long userId, Page<UserLoginLogDO> page) {
        LambdaQueryWrapper<UserLoginLogDO> wrapper = Wrappers.<UserLoginLogDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserLoginLogDO::getUserId, userId)
                .orderByDesc(UserLoginLogDO::getLoginTime);
        
        return selectPage(page, wrapper);
    }

    /**
     * 根据用户名查询登录日志
     * @param username 用户名
     * @param page 分页参数
     * @return 登录日志列表
     */
    default Page<UserLoginLogDO> selectByUsername(String username, Page<UserLoginLogDO> page) {
        LambdaQueryWrapper<UserLoginLogDO> wrapper = Wrappers.<UserLoginLogDO>lambdaQuery()
                .eq(Objects.nonNull(username), UserLoginLogDO::getUsername, username)
                .orderByDesc(UserLoginLogDO::getLoginTime);
        
        return selectPage(page, wrapper);
    }

    /**
     * 查询用户最近的登录记录
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 登录日志列表
     */
    default List<UserLoginLogDO> selectRecentByUserId(Long userId, int limit) {
        LambdaQueryWrapper<UserLoginLogDO> wrapper = Wrappers.<UserLoginLogDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserLoginLogDO::getUserId, userId)
                .eq(UserLoginLogDO::getSuccess, true)
                .orderByDesc(UserLoginLogDO::getLoginTime)
                .last("LIMIT " + limit);
        
        return selectList(wrapper);
    }

    /**
     * 统计用户登录次数
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 登录次数
     */
    default Long countByUserId(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        LambdaQueryWrapper<UserLoginLogDO> wrapper = Wrappers.<UserLoginLogDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserLoginLogDO::getUserId, userId)
                .eq(UserLoginLogDO::getSuccess, true);
        
        if (Objects.nonNull(startTime)) {
            wrapper.ge(UserLoginLogDO::getLoginTime, startTime);
        }
        if (Objects.nonNull(endTime)) {
            wrapper.le(UserLoginLogDO::getLoginTime, endTime);
        }
        
        return selectCount(wrapper);
    }

    /**
     * 清理旧的登录日志
     * @param beforeTime 清理此时间之前的日志
     * @return 清理数量
     */
    default int cleanOldLogs(LocalDateTime beforeTime) {
        LambdaQueryWrapper<UserLoginLogDO> wrapper = Wrappers.<UserLoginLogDO>lambdaQuery()
                .lt(UserLoginLogDO::getLoginTime, beforeTime);
        return delete(wrapper);
    }
}
